package com.dkd.manage.domain;

import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;

/**
 * 员工实体类
 */
@Data
public class Emp {
    /**
     * 主键
     */
    private Long id;

    /**
     * 员工名称
     */
    private String userName;

    /**
     * 所属区域Id
     */
    private Long regionId;

    /**
     * 角色id
     */
    private Long roleId;

    /**
     * 联系电话
     */
    private String mobile;

    /**
     * 员工头像
     */
    private String image;

    /**
     * 是否启用 (1-启用, 0-禁用)
     */
    private Integer status;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 修改时间
     */
    private Date updateTime;

    // ============ 新增字段 ============

    /**
     * 经度
     */
    private BigDecimal longitude;

    /**
     * 纬度
     */
    private BigDecimal latitude;

    /**
     * 技能等级 (1-5)
     * 1: 初级
     * 2: 中级
     * 3: 高级
     * 4: 专家
     * 5: 大师
     */
    private Integer skillLevel;

    /**
     * 每日最大任务数
     */
    private Integer maxDailyTasks;

    /**
     * 专长领域
     * 格式：设备类型ID用逗号分隔，如："1,2,3"
     * 1: 饮料机
     * 2: 零食机
     * 3: 综合机
     * 4: 特殊设备
     */
    private String specialization;

    // ============ 业务方法 ============

    /**
     * 判断员工是否可用
     */
    public boolean isAvailable() {
        return status != null && status == 1;
    }

    /**
     * 判断员工是否已达到每日任务上限
     */
    public boolean isDailyTaskLimitReached(Integer todayCompletedTasks) {
        if (maxDailyTasks == null) {
            return false; // 如果没有设置上限，则认为没有达到
        }
        return todayCompletedTasks != null && todayCompletedTasks >= maxDailyTasks;
    }

    /**
     * 获取专长领域列表
     */
    public String[] getSpecializationArray() {
        if (specialization == null || specialization.trim().isEmpty()) {
            return new String[0];
        }
        return specialization.split(",");
    }

    /**
     * 判断员工是否擅长指定设备类型
     */
    public boolean isSkilledIn(String vmTypeId) {
        if (specialization == null || specialization.trim().isEmpty()) {
            return false;
        }
        String[] skills = getSpecializationArray();
        for (String skill : skills) {
            if (skill.trim().equals(vmTypeId)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 获取技能等级描述
     */
    public String getSkillLevelDescription() {
        if (skillLevel == null) {
            return "未评级";
        }
        switch (skillLevel) {
            case 1:
                return "初级";
            case 2:
                return "中级";
            case 3:
                return "高级";
            case 4:
                return "专家";
            case 5:
                return "大师";
            default:
                return "未知";
        }
    }

    /**
     * 判断员工是否有位置信息
     */
    public boolean hasLocation() {
        return longitude != null && latitude != null;
    }

    /**
     * 获取位置坐标字符串
     */
    public String getLocationString() {
        if (!hasLocation()) {
            return "未知位置";
        }
        return String.format("(%s, %s)", longitude.toPlainString(), latitude.toPlainString());
    }

    /**
     * 验证员工数据的有效性
     */
    public boolean isValid() {
        return userName != null && !userName.trim().isEmpty() &&
                regionId != null &&
                status != null;
    }

    /**
     * 获取显示名称
     */
    public String getDisplayName() {
        if (userName == null) {
            return "未知员工";
        }
        return userName + (mobile != null ? " (" + mobile + ")" : "");
    }

    // ============ 默认值设置方法 ============

    /**
     * 设置默认值
     */
    public void setDefaults() {
        if (status == null) {
            status = 1; // 默认启用
        }
        if (skillLevel == null) {
            skillLevel = 1; // 默认初级
        }
        if (maxDailyTasks == null) {
            maxDailyTasks = 8; // 默认每日8个任务
        }
        if (createTime == null) {
            createTime = new Date();
        }
        if (updateTime == null) {
            updateTime = new Date();
        }
    }

    // ============ 重写方法 ============

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", regionId=" + regionId +
                ", roleId=" + roleId +
                ", mobile='" + mobile + '\'' +
                ", status=" + status +
                ", skillLevel=" + skillLevel +
                ", maxDailyTasks=" + maxDailyTasks +
                ", specialization='" + specialization + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Emp emp = (Emp) o;
        return id != null && id.equals(emp.id);
    }

    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }
}